package com.wyw.design.model.learning.behavioral.responsibilityChain;

/**
 * @Title       Handler 类是链中对象的抽象类，链上的所有的责任对象都需要继承该对象，
 * @Description 我们定义 HandleMessage 方法来进行请求的链式处理，可以看到：
 *                  如果请求的难度级别不高于链对象可处理的难度级别时，由链对象直接负责处理，也就实现了前面讲到的高级工程师也可以处理难度级别为1的初级问题；
 *                  如果请求难度级别过高超出可处理级别则请求继续向下传递，直至没有责任人可以处理为止。
 *              这就是责任链模式的核心。
 * @Author Mr Wu yewen.wu.china@gmail.com
 * @Date 2023/4/17 11:22
 * Update History:
 * Author        Time            Content
 */
public abstract class Handler {
    final static int Difficulty_LEVEL_1_REQUEST = 1; // 难度级别为1
    final static int Difficulty_LEVEL_2_REQUEST = 2; // 难度级别为2
    final static int Difficulty_LEVEL_3_REQUEST = 3; // 难度级别为3
    // 能处理的级别
    private int level = 0;
    // 责任传递，下一个责任人是谁
    private Handler nextHandler;

    // 每个类都要说明一下自己能处理哪些请求
    Handler(int level) {
        this.level = level;
    }

    // 负责Request的请求处理，final关键字声明不允许被子类覆盖
    final void HandleMessage(IRequest request) {
        // 如果请求级别小于可以处理的级别就直接处理，比如：高级工程师也可以处理难度级别为1的请求
        if (request.getRequestLevel() <= this.level) {
            this.response(request);
        } else {
            if (this.nextHandler != null) { // 有后续环节，请求传递
                this.nextHandler.HandleMessage(request);
            } else { // 无后续环节了，按照不同意处理
                System.out.println("--------难度级别为" + request.getRequestLevel() + "的请求-------");
                System.out.println("---抱歉，没有工程师可以处理---\n");
            }
        }
    }

    /*
     * 如果不属于你处理的请求，你应该让请求路由到下一个环节的责任人
     */
    void setNextHandler(Handler nextHandler) {
        this.nextHandler = nextHandler;
    }

    // 有请示那当然要回应
    protected abstract void response(IRequest request);
}